#include<iostream>
#include<vector>
#include<stdio.h>
#include <sys/wait.h>
#include<unistd.h>
#include<stdlib.h>

typedef void (*handler_t)();//函数指针类型
    std::vector<handler_t>handlers;
void fun_one()
{
  printf("这是一个临时任务1\n");
}
void fun_two()
{
  printf("这是一个临时任务2\n");
}
void Load()//父进程闲了想要执行任何方法的时候，只要向Load里面注册，就可以让父进程执行对应的方法
{
handlers.push_back(fun_one);
handlers.push_back(fun_two);
}
int main()
{
  int cnt=5;
  pid_t id=fork();
  if(id<0)
  {
     perror("fork");
     exit(1);

  }
  else if(id==0)
  {
    while(cnt)
    {
      printf("我是子进程：%d\n",cnt--);
     sleep(1);
    }
    
    exit(20);
  }
  else{
         int quit=0;
         while(!quit)
         {
           int status=0;
           pid_t res=waitpid(-1,&status,WNOHANG); //以非阻塞方式等待
           if(res>0)
           {
             //等待成功&&子进程退出
             printf("等待子进程成功，退出码：%d\n",WEXITSTATUS(status));
             quit=1;
           }
           else if(res==0)
           {
             //等待成功&&子进程未退出
             printf("子进程还在运行中，父进程可以等一等\n");
              if(handlers.empty())
              {
                Load();
              }
                for(auto iter:handlers)
                {
                
                  iter();
                 }
            }
           else{
             printf("wait失败\n");
             quit=1;
           }
           sleep(1);
         }
  }
}
  
  

